/*
 * Copyright 2006-2007 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package asphalt2.validator.showerror{
	import asphalt2.validator.IValidateError;
	import asphalt2.validator.util.ValidatorUtils;
	
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	
	import mx.controls.ToolTip;
	import mx.core.Container;
	import mx.core.UIComponent;
	import mx.events.CollectionEvent;
	import mx.managers.ToolTipManager;
	/**
	 * エラーをツールチップで表示します。
	 * エラーのあるコンポーネントに対しては、errorStringでエラーをセットします。
	 * エラーのスタイルについては、各コンポーネントのerrorTipスタイルに依存します。
	 * また、エラーチェックのトリガーとなるコンポーネント上に、エラーが発生した旨を通知する
	 * ツールチップを表示します。
	 * ツールチップの文言、スタイルについては、コンストラクタで指定します。
	 * @author c9katayama
	 */
	public class ShowTooltip{
		/**
		 * ツールチップを右側に出すボーダースタイル
		 **/
		public static const TOOLTOP_BORDER_RIGHT:String = "errorTipRight";
		/**
		 * ツールチップを上側に出すボーダースタイル
		 */
		public static const TOOLTOP_BORDER_ABOVE:String = "errorTipAbove";
		/**
		 * ツールチップを下側に出すボーダースタイル
		 */
		public static const TOOLTOP_BORDER_BELOW:String = "errorTipBelow";
		
		private var _errorString:String;
		private var _tooltipStyleName:String;
		private var _tooltipBorderStyleName:String;
		
		private static const defaultInstance:ShowTooltip = new ShowTooltip();
		/**
		 * エラーチェックのトリガーとなるコンポーネントに表示するエラーメッセージ 
		 **/
		public function get errorString():String{
			return _errorString;
		}
		/**
		 * エラーチェックのトリガーとなるコンポーネントに表示するツールチップの形状 
		 **/
		public function get tooltipBorderStyleName():String{
			return _tooltipBorderStyleName;
		}
		/**
		 * エラーチェックのトリガーとなるコンポーネントに表示するツールチップのスタイル名 
		 **/
		public function get tooltopStyleName():String{
			return _tooltipStyleName;
		}
		
		public function ShowTooltip(
						errorString:String="入力にエラーがあります",
						tooltipBorderStyleName:String=ShowTooltip.TOOLTOP_BORDER_ABOVE,
						tooltipStyleName:String="errorTip"){
			_errorString = errorString;
			_tooltipBorderStyleName = tooltipBorderStyleName;
			_tooltipStyleName = tooltipStyleName;			
		}
		public static function getDefault():ShowTooltip{
			return defaultInstance;
		}		
		public function showTooltopFunction(error:IValidateError,page:Container,eventSource:Object=null):void{
			ValidatorUtils.resetChildrenUIError(page,true);
			var first:Boolean = true;
			//同じコンポーネントへのエラーをまとめる
			var errorMap:Object = {};
			var compArray:Array = new Array();
			for each(var errorObj:Object in error.getErrors()){
				var c:UIComponent = UIComponent(errorObj.component);
				var m:* = errorMap[c];
				if(m==null){
					errorMap[c] = errorObj.message;
					compArray.push(c);
				}else{
					m = m + "\n" + errorObj.message;
					errorMap[c] = m;
				}
			}
			
			for each(var comp:UIComponent in compArray){
				var msg:String = errorMap[comp];
				ValidatorUtils.setUIError(comp,msg);
				if(first){
					comp.setFocus();
					first = false;
				}
			}
			if(eventSource != null && eventSource is UIComponent){
				var targetComp:UIComponent = UIComponent(eventSource);		
				var p:Point = new Point(targetComp.x,targetComp.y);
				p = targetComp.parent.localToGlobal(p);
				var tooltop:ToolTip = null;
				if(tooltipBorderStyleName==TOOLTOP_BORDER_RIGHT){
					tooltop = ToolTipManager.createToolTip(errorString,p.x+targetComp.width,p.y,tooltipBorderStyleName) as ToolTip;
				}else if(tooltipBorderStyleName==TOOLTOP_BORDER_ABOVE){
					tooltop = ToolTipManager.createToolTip(errorString,p.x,p.y,tooltipBorderStyleName) as ToolTip;
					tooltop.move(tooltop.x,tooltop.y-tooltop.height);
				}else if(tooltipBorderStyleName==TOOLTOP_BORDER_BELOW){
					tooltop = ToolTipManager.createToolTip(errorString,p.x,p.y,tooltipBorderStyleName) as ToolTip;
					tooltop.move(tooltop.x,tooltop.y+tooltop.height);
				}else{
					tooltop = ToolTipManager.createToolTip(errorString,p.x,p.y,tooltipBorderStyleName) as ToolTip;
				}
				tooltop.setStyle("styleName", tooltopStyleName);
				//ロールアウトもしくはマウス押下時にツールチップを消去
				var destroyListner:Function = function(e:Event):void{
					targetComp.removeEventListener(MouseEvent.ROLL_OUT,destroyListner);
					targetComp.removeEventListener(MouseEvent.MOUSE_DOWN,destroyListner);
					ToolTipManager.destroyToolTip(tooltop);
				};
				targetComp.addEventListener(MouseEvent.ROLL_OUT,destroyListner);
				targetComp.addEventListener(MouseEvent.MOUSE_DOWN,destroyListner);
			}
		}
	}
}